package domain;

import java.util.Collection;

import javax.persistence.Access;
import javax.persistence.AccessType;
import javax.persistence.Entity;
import javax.persistence.Index;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;

import org.hibernate.validator.constraints.NotBlank;

@Entity
@Access(AccessType.PROPERTY)
@Table(uniqueConstraints = { @UniqueConstraint(columnNames = { "userAccount_id" }) }, indexes = {@Index(columnList = "moroso")} )
public class Vecino extends Actor {

	private String vivienda;
	private String dni;
	private Boolean moroso;

	public Vecino() {
		super();
	}

	@NotBlank
	public String getVivienda() {
		return vivienda;
	}

	public void setVivienda(String vivienda) {
		this.vivienda = vivienda;
	}

	@NotBlank
	@Pattern(regexp = "^\\d{8}[A-Z]{1}$")
	public String getDni() {
		return dni;
	}

	public void setDni(String dni) {
		this.dni = dni;
	}

	@NotNull
	public Boolean getMoroso() {
		return moroso;
	}

	public void setMoroso(Boolean moroso) {
		this.moroso = moroso;
	}

	// Relaciones
	private Collection<ComunidadDeVecinos> comunidadesDeVecinos;
	private Collection<ComunidadDeVecinos> comunidadesDeVecinosPresididas;
	private Collection<Reunion> reuniones;
	private Collection<Reunion> reunionesPresididas;
	private Collection<Cuota> cuotas;
	private Collection<Acta> actasMoroso;
	private Collection<Mensaje> mensajes;

	@ManyToMany
	public Collection<ComunidadDeVecinos> getComunidadesDeVecinos() {
		return comunidadesDeVecinos;
	}

	public void setComunidadesDeVecinos(
			Collection<ComunidadDeVecinos> comunidadesDeVecinos) {
		this.comunidadesDeVecinos = comunidadesDeVecinos;
	}

	@OneToMany(mappedBy = "presidente")
	public Collection<ComunidadDeVecinos> getComunidadesDeVecinosPresididas() {
		return comunidadesDeVecinosPresididas;
	}

	public void setComunidadesDeVecinosPresididas(
			Collection<ComunidadDeVecinos> comunidadesDeVecinosPresididas) {
		this.comunidadesDeVecinosPresididas = comunidadesDeVecinosPresididas;
	}

	@OneToMany(mappedBy = "vecino")
	public Collection<Cuota> getCuotas() {
		return cuotas;
	}

	public void setCuotas(Collection<Cuota> cuotas) {
		this.cuotas = cuotas;
	}

	@ManyToMany(mappedBy = "asistentes")
	public Collection<Reunion> getReuniones() {
		return reuniones;
	}

	public void setReuniones(Collection<Reunion> reuniones) {
		this.reuniones = reuniones;
	}

	@OneToMany(mappedBy = "presidente")
	public Collection<Reunion> getReunionesPresididas() {
		return reunionesPresididas;
	}

	public void setReunionesPresididas(Collection<Reunion> reunionesPresididas) {
		this.reunionesPresididas = reunionesPresididas;
	}

	@Valid
	@OneToMany(mappedBy = "vecinoMoroso")
	public Collection<Acta> getActasMoroso() {
		return actasMoroso;
	}

	public void setActasMoroso(Collection<Acta> actasMoroso) {
		this.actasMoroso = actasMoroso;
	}

	@OneToMany(mappedBy = "vecino")
	public Collection<Mensaje> getMensajes() {
		return mensajes;
	}

	public void setMensajes(Collection<Mensaje> mensajes) {
		this.mensajes = mensajes;
	}

}
